home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / CDC / CDCSXSRC.LZH / SKELTON.HAS < prev    next >
Text File  |  1995-03-20  |  27KB  |  1,216 lines

  1. *======================================================*
  2. *
  3. *
  4. *    SX-WINDOW スケルトン イベントループ部
  5. *            1995.03.20
  6. *    You Utzse@電脳魔術団@Mankaiseisakujo /1993-1995
  7. *
  8. *
  9. *======================================================*
  10.     .include    DOSCALL.MAC    *標準の奴(XC)
  11.     .include    SXCALL.MAC
  12.     .include    SXCALL.H
  13.     .include    YOU200.MAC    *独自のマクロ定義ファイルです
  14.     .include    HASMACRO.MAC    *HAS2.5以降のマクロパッケージ
  15.  
  16.     .include    WORK.INC    *ワークエリアの内容を定義するファイル
  17.     .include    FLAG.INC    *条件付アセンブル処理を定義するファイル
  18.  
  19. .if    USE_MSXLIB=1
  20.     .include    MSXLIB.MAC    *MSXLIBをアセンブラから利用する場合
  21.                     *のヘッダファイル…
  22. .endif
  23.  
  24.  
  25.     .xref    InitGraph
  26. *==============================================*
  27. *        MODULE_HEAD_AREA
  28. *----------------------------------------------*
  29. .text
  30.         dc.b    '$id EV_LOOP Skelton by You Utzse rel.2.0.0$'
  31. .even
  32.  
  33. MDHEAD:                        *[ モジュールヘッダ ]
  34.     dc.l    OBJECT+MDTYPE        *モジュールタイプ
  35.     dc.l    0            *プログラムエリアサイズ (Xファイルの場合意味がない)
  36.     dc.l    SXSTART-MDHEAD        *SX-SHELLからのスタートアドレスオフセット
  37.     dc.l    WORKSIZE+STKSIZE    *ワークエリアのサイズ
  38.     dc.l    COMMONSIZE        *コモンエリアのサイズ
  39.     dc.l    0,0,0            *システム予約
  40.  
  41. *==============================================*
  42. *        DOS_EXEC_ENTRY
  43. *----------------------------------------------*
  44. DOSSTART::                    *コマンドラインから起動した場合
  45.                         *ここからスタートする
  46.  
  47.     lea    64(a1),a1
  48.     move.l    a1,sp
  49.     lea    16(a0),a0
  50.     sub.l    a0,a1
  51.     move.l    a1,-(sp)
  52.     pea    (a0)
  53.     DOS    _SETBLOCK        *専有メモリを縮小する
  54.  
  55.     clr.l    -(sp)
  56.     pea    shcomm(pc)
  57.     pea    shname(pc)
  58.     move.w    #2,-(sp)
  59.     DOS    _EXEC            *デバッグ用カーネルのパスをサーチする
  60.     clr.l    -(sp)
  61.     pea    shcomm(pc)
  62.     pea    shname(pc)
  63.     clr.w    -(sp)
  64.     DOS    _EXEC            *デバッグ用カーネルを起動する
  65.  
  66.     tst.l    d0            *正常に終了した場合
  67.     bpl    p_execi1        *そのまま終了
  68.  
  69.     pea    mes_execerr(pc)        *エラーメッセージを
  70.     DOS    _PRINT            *表示する
  71. p_execi1:
  72.     DOS    _EXIT            *終了
  73.  
  74. .data
  75. mes_execerr:
  76.     dc.b    'カーネルの起動に失敗しました!!!',13,10,0
  77. .even
  78. shname:
  79.     dc.b    'A:\SHELL\SXWDB.X -D -K -R7 -L1',0        *カーネルのオプション
  80. .even
  81. .bss
  82. shcomm:
  83.     ds.b    258
  84. *==============================================*
  85. *        SX_SHELL_ENTRY
  86. *----------------------------------------------*
  87. .text
  88. .even
  89. SXSTART::                *SX-SHELLから起動した場合ここからスタートする
  90.     movea.l    a1,a5            *ワークエリア先頭アドレス
  91.     move.l    a2,cmdLine(a5)        *コマンドラインアドレス
  92.     move.l    a3,envPtr(a5)        *環境アドレス
  93.  
  94.     moveq.l    #0,d0
  95.     move.l    d0,-(sp)
  96.     move.w    #1,-(sp)        *文字列テーブルを再配置不能ブロックに
  97.     move.l    d0,-(sp)        *つくるモード
  98.     pea.l    winRect(a5)
  99.     pea.l    (a2)            *コマンドラインアドレス
  100.     SX    __TSTakeParam,18
  101.     tst.l    d0
  102.     bmi    EXIT2
  103.     move.w    d0,paramFlg(a5)        *オプションを得る
  104.     move.l    a0,argTbl(a5)        *文字列テーブルのアドレス
  105.  
  106. .ifdef    ~VERSION
  107.     jbsr    CHKVER            *[バージョンチェック]
  108.     bmi    EXIT2            *終了処理なしの終了ルーチン
  109. .endif
  110.  
  111.     jbsr    InitWork        *[ワーククリア]
  112.     jbsr    InitInfo        *[パス名関連の初期化]
  113. .iff    OPTION_SW=0
  114. .xref    SWITCHproc
  115.     move.l    argTbl(a5),-(sp)    *文字列テーブルの先頭アドレス
  116.     move.w    #SW_CHK,-(sp)
  117.     SXSUB    SWITCHproc,6
  118.     bmi    EXIT2
  119. .endif
  120.  
  121. .xref    Initproc
  122.     jbsr    Initproc
  123.     bmi    EXIT2
  124.  
  125. .if    WINCOUNT>=1
  126. .if    EXTENDED_WIN=1
  127. xref    InitWin
  128. .endif
  129.     jbsr    InitWin            *[ウィンドウの初期化]
  130.     bmi    EXIT
  131. .endif
  132.  
  133. .if    WINCOUNT>=1
  134. .xref    CtrlInitproc
  135.     jbsr    CtrlInitproc        *コントロール初期化(外部で用意)
  136.     bmi    EXIT
  137. .endif
  138.  
  139.     move.w    #USR_EV_MASK,eventMask(a5)
  140.  
  141. *==============================================*
  142. *        MAIN_LOOP
  143. *----------------------------------------------*
  144. MAIN_LOOP::
  145.     pea    eventRec(a5)
  146.     move.w    eventMask(a5),-(sp)
  147.     SX    __TSEventAvail,6    *イベント取得
  148.  
  149.     moveq.l    #%1111,d0
  150.     and.w    eventRec_what(a5),d0        *コードが返る
  151.     add.w    d0,d0
  152.     move.l    d0,S_event(a5)            *「サブ」のウィンドウが参照するワーク
  153.     move.w    eventTable(pc,d0.w),d0        *イベントコードによって
  154.     jsr    eventTable(pc,d0.w)        *分岐する
  155.     blt    EXIT                *終了ならmove.l #-1,d0してもどる
  156.  
  157. .iff    WINCOUNT<=1
  158. .xref    SUB_LOOP
  159.     jbsr    SUB_LOOP        *他にウィンドウを開くなら飛ぶ
  160.     blt    EXIT            *終了ならmove.l #-1,d0してもどる
  161. .endif
  162.  
  163.     bra    MAIN_LOOP
  164.  
  165. *----------------------------------------------*
  166. eventTable:                    *分岐テーブル
  167.     dc.w    IDLE-eventTable            *0    アイドルイベント
  168.     dc.w    MSLDOWN-eventTable        *1    レフトダウンイベント
  169.     dc.w    MSLUP-eventTable        *2    レフトアップイベント
  170.     dc.w    MSRDOWN-eventTable        *3    ライトダウンイベント
  171.     dc.w    MSRUP-eventTable        *4    ライトアップイベント
  172.     dc.w    KEYDOWN-eventTable        *5    キーダウンイベント
  173.     dc.w    KEYUP-eventTable        *6    キーアップイベント
  174.     dc.w    UPDATE-eventTable        *7    アップデートイベント
  175.     dc.w    dammy-eventTable        *8    --
  176.     dc.w    ACTIVATE-eventTable        *9    アクティベイトイベント
  177.     dc.w    dammy-eventTable        *10    --
  178.     dc.w    dammy-eventTable        *11    --
  179.     dc.w    SYSTEM1-eventTable        *12    システムイベント1
  180.     dc.w    SYSTEM2-eventTable        *13    システムイベント2
  181.     dc.w    dammy-eventTable        *14    システムイベント3
  182.     dc.w    dammy-eventTable        *15    システムイベント4
  183. *==============================================*
  184. *通常不要なイベント
  185. *----------------------------------------------*
  186. MSLUP::
  187. MSRUP::
  188. KEYUP::
  189. dammy::
  190.     ~T
  191.     rts                    *なにもしないで戻る
  192. *==============================================*
  193. IDLE::
  194. .iff    IDLE_MASK=0
  195. .xref    IDLEproc
  196.     SXSUB    IDLEproc,0
  197. .endif
  198.     rts
  199. *==============================================*
  200. *        EVENT_ROUTINE
  201. *==============================================*
  202. *[レフトダウンイベント]
  203. *左クリックの操作
  204. *
  205. *----------------------------------------------*
  206. MSLDOWN::
  207. .if    WINCOUNT>=1
  208. .xref    MSLDproc
  209.     move.l    eventRec_whom1(a5),d0    *左クリックが起きたウィンドウレコード
  210.     beq    MSLD9            *NILなら
  211.     Xlea    winPtr(a5),a1        *自分のウィンドウ上で発生したか?
  212.     cmp.l    a1,d0
  213.     bne    MSLD9            *違うならMSLD9へ
  214.  
  215.     SETPORT3 winPtr(a5)        *自分へのイベントなので問答無用でSETPORTする
  216.  
  217.     SXSUB    GetEvent,0        *自分へのイベントなのでイベントを取り除く
  218.  
  219.     jbsr    ChkMouse_DClick        *ダブルクリックの判定
  220.  
  221.     SXSUB    MSLDproc,0        *(d0に戻り値いれること
  222.                     *エラーチェックずみのこと)
  223.  
  224.     cmp.w    #W_INCLOSE,d0        *クローズボックス?
  225.     beq    CloseBox        *ならばお終い
  226.  
  227. MSLD9:
  228.     ~T
  229.     rts
  230. .endif
  231. *==============================================*
  232. *[ライトダウンイベント]
  233. *----------------------------------------------*
  234. MSRDOWN::
  235. .if    WINCOUNT>=1
  236. .xref    MSRDproc
  237.     move.l    eventRec_whom1(a5),d0        *右クリック時のウィンドウレコード
  238.     beq    MSRD9                *NILなら
  239.     Xlea    winPtr(a5),a0            *自分のウィンドウレコード
  240.     cmp.l    a0,d0                *同じウィンドウ上で発生したか
  241.     bne    MSRD9
  242.  
  243.     move.l eventRec_ShiftBit(a5),d0
  244.     ifne <tst.w winActive(a5)>        *現在ウィンドウはアクティブか?
  245.         SETPORT3 winPtr(a5)
  246.         SXSUB    ChkMousePtr,0            *現在のマウスのローカル座標を
  247.                             *ワークにいれる
  248.         SXSUB    MSRDproc,0
  249.         bmi    MSRD_ERR
  250.     elseifne <andi.l #KS_OPT1,d0>
  251.         SETPORT3 winPtr(a5)
  252.         SXSUB    ChkMousePtr,0
  253.         SXSUB    MSRDproc,0
  254.         bmi    MSRD_ERR
  255.     endif
  256.  
  257. .endif
  258. MSRD9:
  259.     ~T
  260.     rts
  261. MSRD_ERR:
  262.     ~F
  263.     rts
  264. *==============================================*
  265. *[キーダウンイベント]
  266. *----------------------------------------------*
  267. KEYDOWN::
  268. .if    WINCOUNT>=1
  269. .xref    KEYDproc
  270.     ifne    <tst.w    winActive(a5)>        *現在ウィンドウはアクティブか?
  271.         ifeq    <SCUT    K_Q,KS_OPT1>
  272.             ~F
  273.             rts            *アクティブでOPT1+Qなら終了
  274.         endif
  275.     endif
  276. .endif
  277.  
  278.     SXSUB    KEYDproc,0
  279.     ~T
  280.     rts
  281. *==============================================*
  282. *[アップデートイベント]
  283. *----------------------------------------------*
  284. UPDATE::
  285. .if    WINCOUNT>=1
  286. .xref    UPDTproc
  287.     Xpea    winPtr(a5)
  288.     SX    __WMUpdate,4
  289.  
  290.     SXSUB    UPDTproc,0
  291.  
  292.     Xpea    winPtr(a5)
  293.     SX    __WMUpdtOver,4
  294. .endif
  295.     ~T
  296.     rts
  297. *==============================================*
  298. *[ アクティベートイベント ]
  299. *----------------------------------------------*
  300. ACTIVATE::
  301. .if    WINCOUNT>=1
  302. .xref    ACTproc
  303.     move.l    eventRec_whom1(a5),d0
  304.     beq    ACT9                *NILなら
  305.     Xlea    winPtr(a5),a0            *自分のウィンドウが
  306.     cmp.l    a0,d0                *アクティブになった?
  307.     bne    ACT0                *違うのならACT0へ
  308.     move.w    #-1,winActive(a5)        *アクティブフラグをセット
  309.  
  310.     jbsr    ACTproc
  311.     bra    ACT9
  312. ACT0:
  313.     move.w    #0,winActive(a5)        *アクティブフラグをリセット
  314.     jbsr    ACTproc
  315. .endif
  316. ACT9:
  317.     ~T
  318.     rts
  319. *==============================================*
  320. *[システムイベント]
  321. *----------------------------------------------*
  322. SYSTEM1::
  323. SYSTEM2::
  324.     move.w    eventRec_what2(a5),d0
  325.     cmp.w    #ENDTSK,d0            *タスクの終了?
  326.     beq    CloseBox            *ならばおしまい
  327.     cmp.w    #CLOSEALL,d0            *全ウィンドウのクローズ?
  328.     beq    CloseBox            *ならばおしまい
  329.  
  330. .iff    OPTION_MODE=0
  331. *.xref    SWstr_create
  332.     move.l    d0,-(sp)            *他にセーブするものがある場合の保険
  333.     ifeq    <cmp.w    #SAVE,d0>        *FLAG.INCでオプションあり設定なら
  334.         move.w    #SW_SAVE,-(sp)
  335.         SXSUB    SWITCHproc,2        *OPTIONセーブルーチンが組み込まれる
  336.     endif
  337.     move.l    (sp)+,d0            *メインループには戻らない
  338. .endif
  339.  
  340. .iff    EXT_SYS_EV=0
  341. .xref    SYSproc
  342.     jbsr    SYSproc                *その他のイベントに対応するなら飛ぶ
  343.     rts                    *結果はd0に入れて返ること
  344. .endif
  345.     ~T
  346.     rts
  347.  
  348. *==============================================*
  349. *ウィンドウをアクティブにする
  350. *----------------------------------------------*
  351. MainWindowSelect::
  352. .if    WINCOUNT>=1
  353.     Xpea    winPtr(a5)            *自分のウィンドウをアクティブに
  354.     SX    __WMSelect,4
  355. .endif
  356.     ~T
  357.     rts
  358. *==============================================*
  359. *クローズボックス
  360. *----------------------------------------------*
  361. CloseBox::
  362.     ~F
  363.     rts
  364. *==============================================*
  365. *        EXIT
  366. *==============================================*
  367. EXIT::                        *[終了する]
  368.     jbsr    TINI                *アプリケーションの終了処理
  369. EXIT2:                        *[いきなり終了する]廃棄するものがなにもない
  370.     move.l    d0,-(sp)
  371.     SX    __TSExit,0
  372.  
  373.  
  374. *==============================================*
  375. TINI::
  376. .if    WINCOUNT>=1
  377.  
  378. .xref    CtrlTiniproc
  379.     jbsr    CtrlTiniproc
  380.  
  381.     Xpea    winPtr(a5)            *メインウィンドウの廃棄
  382.     .if    WINTYPE='H'
  383.         SX    __WMClose,4
  384.     .else
  385.     .if    WINTYPE='P'
  386.         SX    __WMDispose,4
  387.     .endif
  388.     .endif
  389. .xref    TINIproc
  390.     SXSUB    TINIproc,0            *メモリ廃棄など
  391. .endif
  392.         rts
  393. *==============================================*
  394. *デフォルトのウィンドウ生成
  395. *==============================================*
  396. .if    EXTENDED_WIN=0
  397. .if    WINCOUNT>=1
  398. InitWin:
  399.     move.l    winRect(a5),d0
  400.     move.w    paramFlg(a5),d1
  401.     btst    #0,d1                *'-W'オプションが指定された?
  402.     beq    _POS0                *されなかったら_POS0へ
  403.  
  404.     move.l    winRect+4(a5),d1        *正しいレクタングルが指定されたか
  405.     beq    _POS1                *X2,Y2が0
  406.     tst.w    d1
  407.     cmp.w    d0,d1
  408.     ble    _POS1                *Y2がY1より小さいか同じ
  409.     swap    d0
  410.     swap    d1
  411.     cmp.w    d0,d1
  412.     bgt    _POS2                *まっとうな時
  413.     swap    d0
  414.     swap    d1
  415.     bra    _POS1                *X2がX1より小さいか同じ
  416. _POS0:
  417.     SX    __TSGetWindowPos,0
  418.     move.l    d0,winRect(a5)            *デフォルト位置を得る
  419. _POS1:
  420.     add.l    #WIN_X*$10000+WIN_Y,d0        *ウィンドウレクタングルを作成
  421.     move.l    d0,winRect+4(a5)
  422. _POS2:
  423. main_win_open:
  424.     move.l    taskID(a5),-(sp)        *タスクID
  425.     move.w    #TRUE,-(sp)            *クローズボックスあり
  426.     move.l    #TRUE,-(sp)            *手前に
  427.     move.w    #_WDEF_NUM*16+WINOPT,-(sp)    
  428.     move.w    #TRUE,-(sp)            *可視
  429.     pea.l    WINTITLE(pc)            *LASCII
  430.     pea.l    winRect(a5)            *ウィンドウレクタングル
  431. .if    WINTYPE='H'
  432.     Xpea    winPtr(a5)            *ワーク上に作成
  433. .else
  434. .if    WINTYPE='P'
  435.     pea.l    0.w                *ヒープ上に作成
  436. .endif
  437. .endif
  438.     SX    __WMOpen,26
  439.     tst.l    d0                *エラー?
  440.     bmi    Win_init_ERR            *ならば_INIT_Errへ
  441.     move.w    #-1,winActive(a5)            *アクティブフラグをセット
  442. .if    WINTYPE='P'
  443.     move.l    a0,winPtr(a5)            *winPtrをヒープに確保させた時
  444. .endif
  445.     jbsr    InitGraph            *このウィンドウのグラフポートの初期設定
  446.     ~T
  447.     rts
  448. Win_init_ERR:
  449.         ~F
  450.         rts
  451. .endif
  452. WINTITLE:
  453.         MAINWIN_NAME
  454. .even
  455. .endif
  456. .text
  457. *==============================================*
  458. *        INIT共通
  459. *==============================================*
  460. *VERSION_CHECK
  461. * ~VERSION が定義されていること
  462. *----------------------------------------------*
  463. .ifdef    ~VERSION
  464. CHKVER:
  465.     SX    __SXVer,0            *システムのバージョンを取得
  466.     cmp.w    #~VERSION,d0            *(~VERSION)どのバージョン以降で動くか
  467.     bcs    VER_ERR                *バージョンエラー
  468.     ~T
  469.     rts
  470. VER_ERR:
  471.     lea.l    ver_e_mes(PC),a0        *「バージョンが違う」
  472.     jbsr    PrintMyErr
  473.     rts
  474. .endif
  475. *==============================================*
  476. *A5相対で参照するワークを初期化する
  477. *----------------------------------------------*
  478. InitWork:
  479.  
  480.     move.l    #clr_end-clr_top,d0        *何バイトか
  481.     lea.l    clr_top(a5),a0            *どのアドレスからか
  482.     moveq.l    #0,d1                *0で埋める
  483.     jbsr    FillMem
  484.  
  485.     rts
  486. *==============================================*
  487. *タスクIDと、パス、タスク名、ファイル
  488. *名を取り出す
  489. ofs    =    -512
  490.     .offset    ofs
  491. task_WK        ds.b    512
  492. .text
  493. *----------------------------------------------*
  494. InitInfo:
  495.     SX    __TSGetID,0
  496.     move.l    d0,taskID(a5)            *タスクIDを得る
  497.  
  498.     link    a6,#ofs
  499.  
  500. *        moveq.l    #-1,d0
  501. *        move.w    d0,-(sp)        *自分のID
  502.     movqw    -1
  503.     pea    task_WK(a6)
  504.     SX    __TSGetTdb,6
  505. *----------------------------------------------*
  506. *PATH
  507.     lea    my_path(a5),a3
  508.     pea    (a3)                *パス名格納先
  509.     pea    task_WK(a6)            *ファイル名へのポインタ
  510.     SX    _NAMECK,8            *DOSCALL
  511. *----------------------------------------------*
  512. *NAME
  513.     lea    my_name(a5),a2
  514.     move.l    a2,a0                *名前を入れる先
  515.     lea    67(a3),a1            *ファイル名へのアドレス
  516.     jbsr    CopyStrZ
  517. *----------------------------------------------*
  518. *MY_LEN
  519.     move.l    a0,d0
  520.     sub.l    a2,d0
  521.     move.b    d0,my_len(a5)            *NAMEの長さ
  522. *----------------------------------------------*
  523. *MY FILENAME
  524.     lea    my_file(a5),a0            *ファイル名の入先
  525.     lea    67(a3),a1            *(ファイル名へのアドレス)
  526.     jbsr    CopyStrZ
  527.  
  528.     lea    86(a3),a1            *(拡張子へのアドレス)
  529.     jbsr    CopyStrZ
  530. *----------------------------------------------*
  531. *STARTUP CHECK                    *スタートアップから起動されたかどうか?
  532.     lea.l    task_WK(a6),a0
  533.     ifeq    <btst.b    #0,$1D5(a0)>
  534.         move.w    #0,StupChk(a5)
  535.     else
  536.         move.w    #-1,StupChk(a5)        *-1ならスタートアップから
  537.     endif
  538.  
  539.     unlk    a6
  540.     rts
  541. *==============================================*
  542. *        下請けルーチン
  543. *==============================================*
  544. *メモリを指定されたデータで埋める
  545. *93.10.01 rewrite
  546. *IN    d0.l = length (1..)
  547. *    d1.b = data
  548. *    a0.l = ptr
  549. *OUT    a0.l = nextPtr
  550. *    d0.l = RESAULT CODE(0,MINUS)
  551. *----------------------------------------------*
  552. FillMem::
  553.     move.l    d2,-(sp)
  554.     move.l    d1,-(sp)
  555.  
  556.     tst.l    d0
  557.     ble    FillMem_err            *length == 0
  558.  
  559.     move.l    a0,d2
  560.     lsr.w    #1,d2                *2で割って
  561.     bcc    FillMem_1            *アドレスが奇数なら分岐しない
  562.  
  563.     move.b    d1,(a0)+            *先頭を1バイト埋める
  564.     subq.l    #1,d0                *ながさの帳尻合わせる
  565.     ble    FillMem_9            *1バイトならおしまい
  566. FillMem_1:
  567.     jbsr    Fillsub
  568.  
  569. FillMem_9:
  570.         ~T
  571. FillMem_err:
  572.     move.l    (sp)+,d1
  573.     move.l    (sp)+,d2
  574.     rts
  575.  
  576. *==============================================*
  577. *ポインタの内容を指定されたデータで埋める
  578. *スタックに、データ(.w)と再配置不能ブロックのア
  579. *ドレスをいれる。データは、下位バイトのみを認識する
  580. *上位バイトは不定で構わない
  581. .offset    0
  582.         ds.l    2
  583. fp_ptr:        ds.l    1
  584.         ds.b    1
  585. fp_data:    ds.b    1
  586. .text
  587. *----------------------------------------------*
  588. FillPtr::
  589.     link    a6,#0
  590.     move.l    d1,-(sp)
  591.     move.l    d2,-(sp)
  592.  
  593.     move.l    fp_ptr(a6),-(sp)
  594.     SX    __MMPtrSizeGet,4        *ブロックの論理サイズを得る
  595.     move.l    d0,d2
  596.     blt    FillPtr_err
  597.     beq    FillPtr_9
  598.  
  599.     move.l    fp_ptr(a6),a0
  600.     move.b    fp_data(a6),d1
  601.  
  602.     jbsr    Fillsub
  603.  
  604. FillPtr_9:
  605.         ~T
  606. FillPtr_err:
  607.     move.l    (SP)+,d2
  608.     move.l    (SP)+,d1
  609.     unlk    A6
  610.     rts
  611. *==============================================*
  612. *ハンドルの内容を指定されたデータで埋める
  613. *スタックに、データ(.w)と再配置可能ブロックのハ
  614. *ンドルをいれる。データは、下位バイトのみを認識
  615. *するので上位バイトは不定で構わない
  616. .offset    0
  617.         ds.l    2
  618. fh_hdl:        ds.l    1
  619.         ds.b    1
  620. fh_data:    ds.b    1
  621. .text
  622. *----------------------------------------------*
  623. FillHdl::
  624.     link    a6,#0
  625.     move.l    d1,-(sp)
  626.     move.l    d2,-(sp)
  627.  
  628.     move.l    fh_hdl(a6),-(sp)
  629.     SX    __MMHdlSizeGet,4        *ブロックの論理サイズを得る
  630.     move.l    d0,d2
  631.     blt    FillHdl_err
  632.     beq    FillHdl_9            *空のハンドルということもある
  633.  
  634.     HDL2PTR    fh_hdl(a6),a0            *ハンドルから現在のアドレスを得る
  635.  
  636.     move.b    fh_data(a6),d1
  637.  
  638.     jbsr    Fillsub
  639.  
  640. FillHdl_9:
  641.     ~T
  642. FillHdl_err:
  643.     move.l    (SP)+,d2
  644.     move.l    (SP)+,d1
  645.         unlk    A6
  646.         rts
  647. *----------------------------------------------*
  648. *FILL系共通ルーチン
  649. Fillsub:
  650.     move.b    d1,d2
  651.     lsl.w    #8,d1
  652.     move.b    d2,d1
  653.     move.w    d1,d2
  654.     swap    d1
  655.     move.w    d2,d1            *4Byteのデータをd1に展開
  656.                     *(d1.b以外はなにが入っていても構わない)
  657.  
  658.     move.l    d0,d2            *length
  659.  
  660.     lsr.l    #4,d0            *16で割って
  661.     ble    Fillsub_1        *d0<16のとき
  662. Fillsub_lp:
  663.     move.l    d1,(a0)+
  664.     move.l    d1,(a0)+
  665.     move.l    d1,(a0)+
  666.     move.l    d1,(a0)+
  667.     subq.l    #1,d0
  668.     bne    Fillsub_lp
  669. Fillsub_1:
  670.     andi.l    #%1111,d2
  671.     beq    Fillsub_3
  672.     subq.l    #1,d2
  673. Fillsub_2:
  674.     move.b    d1,(a0)+
  675.     dbra    d2,Fillsub_2
  676. Fillsub_3:
  677.     rts
  678. *==============================================*
  679. *タスク名付きエラーダイアログ
  680. *TSErrDialogNでいいんだけどね…
  681. *IN    a0.l = メッセージへのポインタ
  682. *OUT    d0.l = -1
  683. OFS    =    -128
  684.     .offset    OFS
  685. PME_BUF        ds.b    128
  686. .text
  687. *----------------------------------------------*
  688. PrintMyErr::
  689.     link    a6,#OFS
  690.     movem.l    a1-a2,-(sp)
  691.     move.l    a0,a2
  692.  
  693.     lea.l    PME_BUF(a6),a0
  694.     move.l    a2,a1
  695.     jbsr    CopyStrZ
  696.  
  697.     lea.l    my_file(a5),a1
  698.     jbsr    CopyStrZ
  699.  
  700.     pea.l    PME_BUF(a6)
  701.     move.w    #YELLOW_F,-(sp)
  702.     SX    __DMError,6
  703.  
  704.     ~F
  705.     movem.l    (sp)+,a1-a2
  706.     unlk    a6
  707.     rts
  708. *==============================================*
  709. *エラーダイアログの表示。
  710. *in    a0.l = メッセージへのポインタ
  711. *out    d0.l = -1
  712. *----------------------------------------------*
  713. PrintErr::
  714.     pea    (a0)
  715.     move.w    #YELLOW_F,-(sp)        *黄旗
  716.     SX    __DMError,6
  717.  
  718.     ~F
  719.     rts
  720. *==============================================*
  721. *ASCIIZ 文字列をコピーする。
  722. *IN    a0.L = destPtr
  723. *    a1.L = srcPtr
  724. *OUT    a0.L = destPtr(文字列の最後を指す $0の位置)
  725. *    a1.L = srcPtr(文字列の最後+1を指す)
  726. *----------------------------------------------*
  727. CopyStrZ::
  728.     move.b    (a1)+,(a0)+
  729.     bne    CopyStrZ        *$0 でないなら
  730.     subq.l    #1,a0
  731.     rts
  732. *==============================================*
  733. *93.10.30 version
  734. *LASCII 文字列をコピーする。
  735. *IN    a0.L = destPtr
  736. *    a1.L = srcPtr
  737. *OUT    a0.L = destPtr(文字列の最後+1を指す)
  738. *    a1.L = srcPtr (文字列の最後+1を指す)
  739. *----------------------------------------------*
  740. CopyStrL::
  741.     moveq.l    #0,d0
  742.     move.b    (a1),d0            *カウンタ(これでいいのだ~)
  743. @@:
  744.     move.b    (a1)+,(a0)+
  745.     dbra    d0,@b
  746.     rts
  747. *==============================================*
  748. *イベントを取り除く。
  749. *カレントグラフポートをセット。
  750. *----------------------------------------------*
  751. GetEvent::
  752.     pea    eventRec(a5)
  753.     move.w    #EM_EVERY,-(sp)
  754.     SX    __TSGetEvent,6
  755.     rts
  756. *==============================================*
  757. *イベントを取り除く。
  758. *カレントグラフポートをセット。
  759. *----------------------------------------------*
  760. NextEvent::
  761.     pea    eventRec(a5)
  762.     move.w    #EM_MSTOKEY,-(sp)
  763.     SX    __EMGet,6
  764.     rts
  765. *==============================================*
  766. *ワークD_Clickに結果を格納。
  767. *ワークnow_mptにマウスのローカル座標を格納。
  768. *MS_time,MS_locateを使用。
  769. *SETPORTしてから使うこと
  770. *----------------------------------------------*
  771. ChkMouse_DClick::
  772.     move.l    eventRec_when(a5),d1    *左ダウンの時間(d1)が
  773.     move.l    d1,d0
  774.     sub.l    MS_time(a5),d1        *今回の左ダウンは直前の左ダウンの何秒後か
  775.     move.l    d0,MS_time(a5)        *ダウン時間を更新する
  776.  
  777.     tst.b    D_Click(a5)        *フラグチェック
  778.     bne    ChkMouse_skip        *ダブルクリック後なので、なにもしない
  779.  
  780.     move.l    eventRec_whom2(a5),d0
  781.     swap    d0
  782.     sub.w    MS_locate(a5),d0
  783.     addq.w    #3,d0            *前後2ポイント分の余裕見て
  784.     blt    ChkMouse_skip        *座標のチェック
  785.     subq.w    #6,d0
  786.     bgt    ChkMouse_skip
  787.     swap    d0
  788.     sub.w    MS_locate+2(a5),d0
  789.     addq.w    #3,d0
  790.     blt    ChkMouse_skip
  791.     subq.w    #6,d0
  792.     bgt    ChkMouse_skip
  793.  
  794.     SX    __EMDClickGet,0        *ダブルクリック基準時間を読み出すコール
  795.     cmp.l    d0,d1
  796.     sle.b    D_Click(a5)        *ダブルクリックフラグ
  797.  
  798.     bra    ChkMouse_q
  799.  
  800. ChkMouse_skip:
  801.     sf.b    D_Click(a5)        *フラグ下ろす
  802.  
  803. ChkMouse_q:
  804.     move.l    eventRec_whom2(a5),d0
  805.     move.l    d0,MS_locate(a5)    *今回の位置を記録
  806.  
  807.     move.l    d0,-(sp)
  808.     SX    __GMGlobalToLocal,4
  809.     move.l    d0,now_mpt(a5)        *ローカル座標(ちゃんと返ります)
  810.  
  811.     rts
  812.  
  813.  
  814. *==============================================*
  815. *ワークnow_mptにマウスのローカル座標を格納。
  816. *----------------------------------------------*
  817. ChkMousePtr::
  818.  
  819.     move.l    eventRec_whom2(a5),-(sp)
  820.     SX    __GMGlobalToLocal,4
  821.     move.l    d0,now_mpt(a5)        *ローカル座標
  822.     rts
  823.  
  824. *==============================================*
  825. *へこみレクタングルを書いたり、消したりする関数
  826. *    PEN MODE
  827. *    PENSIZE
  828. *    RECT
  829. *の順にスタックに積む
  830. *ペン位置は変更される
  831.  
  832. .offset        -18
  833. SBL:        ds.w    1            *LEFT
  834. SBT:        ds.w    1            *TOP
  835. SBR:        ds.w    1            *RIGHT
  836. SBB:        ds.w    1            *BOTTOM
  837. SBFC:        ds.w    1            *FORE COLOR
  838. SBBC:        ds.w    1            *BACK COLOR
  839. SBPM        ds.w    1            *PEN MODE
  840. SBPS        ds.l    1            *PEN SIZE
  841. ds.l    2
  842. SBptr:        ds.l    1            *レクタングルのアドレス
  843. SBPSize:    ds.l    1            *ペンサイズ
  844. SBPmode:    ds.w    1            *モード
  845. .text
  846. *==============================================*
  847. __ShadowBox::
  848.     link    a6,#-18
  849.     move.l    d1,-(sp)
  850.  
  851.     move.l    SBptr(a6),a0
  852.  
  853.     move.l    (a0),SBL(a6)
  854.     move.l    4(a0),SBR(a6)        *LTRBをいれる
  855.  
  856.     moveq.l    #G_BLACK,d0
  857.     move.w    d0,-(sp)
  858.     SX    __GMForeColor,2        *ForeColorを黒
  859.     move.w    d0,SBFC(a6)        *ForeColor退避
  860.  
  861.     move.w    SBPmode(a6),d0
  862.     tst.w    d0
  863.     bne    @f
  864.     moveq.l    #0,d0            *ForeColorでPSET
  865. @@:
  866.  
  867.     move.w    d0,-(sp)
  868.     SX    __GMPenMode,2
  869.     move.w    d0,SBPM(a6)
  870.  
  871.     move.l    SBPSize(a6),d0
  872.     tst.l    d0
  873.     bne    @f
  874.  
  875.     move.l    #1*$10000+1,-(sp)    *1,1
  876.     bra    ~SB1
  877. @@:
  878.     move.l    d0,-(sp)
  879. ~SB1:
  880.     SX    __GMPenSize,4
  881.     move.l    d0,SBPS(a6)        *PEN SIZEを退避
  882.  
  883.     move.w    SBL(a6),d1
  884.     swap    d1
  885.     move.w    SBB(a6),d1
  886.  
  887.     move.l    d1,-(sp)
  888.     SX    __GMMove,4        *左下
  889.  
  890.     move.w    SBT(a6),d1
  891.  
  892.     move.l    d1,-(sp)
  893.     SX    __GMLine,4        *左下から左上
  894.  
  895.     swap    d1
  896.     move.w    SBR(a6),d1
  897.     swap    d1
  898.  
  899.     move.l    d1,-(sp)
  900.     SX    __GMLine,4        *左上から右上
  901.  
  902.     moveq.l    #G_WHITE,d0
  903.     move.w    d0,-(sp)
  904.     SX    __GMForeColor,2        *ForeColorを白
  905.  
  906.     move.w    SBB(a6),d1
  907.  
  908.     move.l    d1,-(sp)
  909.     SX    __GMLine,4        *右上から右下
  910.  
  911.     swap    d1
  912.     move.w    SBL(a6),d1
  913.     swap    d1
  914.  
  915.     move.l    d1,-(sp)
  916.     SX    __GMLine,4        *右下から左下
  917.  
  918.     move.w    SBFC(a6),-(sp)
  919.     SX    __GMForeColor,2        *ForeColorを黒
  920.  
  921.     move.w    SBPM(a6),-(sp)
  922.     SX    __GMPenMode,2
  923.     move.w    d0,SBPM(a6)
  924.  
  925.     move.l    SBPS(a6),-(sp)
  926.     SX    __GMPenSize,4
  927.     move.l    d0,SBPS(a6)        *PEN SIZEを退避
  928.  
  929.     move.l    (sp)+,d1
  930.     unlk    a6
  931.     rts
  932. *===============================================*
  933. *    ローカルリソース(自分のパスのみ検索)
  934. *    オープンルーチン
  935. *    マイナスはエラー
  936. *    返り値    a0不定    d0=Resmapへのハンドル
  937. *    オープンするリソースファイルが1つの
  938. *    場合しか使えません(いまんとこ)
  939. *===============================================*
  940. .iff    USE_RES=0
  941. .offset    -92
  942. mro_path:    ds.b    92
  943. .text
  944. MYResOpen::
  945.     link    a6,#-92
  946.     move.l    a1,-(sp)
  947.     lea.l    my_path(a5),a1
  948.     lea.l    mro_path(a6),a0
  949.     jbsr    CopyStrZ
  950.     move.l    8(a6),a1
  951.     jbsr    CopyStrZ
  952.  
  953.     pea.l    mro_path(a6)
  954.     SX    __TSResOpen,4
  955.     bmi    MRO_err
  956.     movea.l    a0,a1
  957.     SX    __TSResLoad,0
  958.     move.l    a1,-(sp)
  959.     SX    __TSCurResSet,4
  960.     move.l    a1,d0
  961.     move.l    (sp)+,a1
  962.     unlk    a6
  963.     rts
  964. MRO_err:
  965.     lea.l    MRO_err_mes(pc),a0
  966.     jbsr    PrintMyErr
  967.  
  968.     move.l    (sp)+,a1
  969.     unlk    a6
  970.     ~F
  971.     rts
  972. MRO_err_mes:
  973.     dc.b    'リソースがオープンできません。',CR
  974.     dc.b    '実行ファイルと同じディレクトリに、',CR
  975.     dc.b    'LBファイルをインストールしてください。',CR,0
  976. .endif
  977. *===============================================*
  978. *    ローカルリソース(自分のパスのみ検索)
  979. *    クローズルーチン
  980. *===============================================*
  981. .iff    USE_RES=0
  982. .offset    -92
  983. mrc_path:    ds.b    92
  984. .text
  985. .xdef    MYResClose
  986. MYResClose:
  987.     link    a6,#-92
  988.     move.l    a1,-(sp)
  989.     lea.l    my_path(a5),a1
  990.     lea.l    mrc_path(a6),a0
  991.     jbsr    CopyStrZ
  992.     move.l    8(a6),a1
  993.     jbsr    CopyStrZ
  994.  
  995.     pea.l    mro_path(a6)
  996.     SX    __TSResClose,4
  997.     bmi    MRC_err
  998.     move.l    (sp)+,a1
  999.     unlk    a6
  1000.     rts
  1001. MRC_err:
  1002.     lea.l    MRO_err_mes(pc),a0
  1003.     jbsr    PrintMyErr
  1004.  
  1005.     move.l    (sp)+,a1
  1006.     unlk    a6
  1007.     ~F
  1008.     rts
  1009. .endif
  1010. *===============================================*
  1011. *    ローカルリソース(自分のパスのみ検索)
  1012. *    セーブクローズルーチン
  1013. *===============================================*
  1014. .iff    USE_RES=0
  1015. .offset    -92
  1016. mrs_path:    ds.b    92
  1017. .text
  1018. .xdef    MYResSave
  1019. MYResSave:
  1020.     link    a6,#-92
  1021.     move.l    a1,-(sp)
  1022.     lea.l    my_path(a5),a1
  1023.     lea.l    mrs_path(a6),a0
  1024.     jbsr    CopyStrZ
  1025.     move.l    8(a6),a1
  1026.     jbsr    CopyStrZ
  1027.  
  1028.     pea.l    mro_path(a6)
  1029.     SX    __TSResSave,4
  1030.     bmi    MRS_err
  1031.     move.l    (sp)+,a1
  1032.     unlk    a6
  1033.     rts
  1034. MRS_err:
  1035.     lea.l    MRO_err_mes(pc),a0
  1036.     jbsr    PrintMyErr
  1037.  
  1038.     move.l    (sp)+,a1
  1039.     unlk    a6
  1040.     ~F
  1041.     rts
  1042. .endif
  1043. *===============================================*
  1044. *メニューアイテム変更1
  1045. *アクティブチェンジ
  1046. *move.l    メニューハンドル,-(sp)
  1047. *move.w    アイテム番号,-(sp)    1~
  1048. *move.w    変更フラグ,-(sp)    0,1
  1049. *0ならインアクティブ、1ならアクティブ
  1050. *-----------------------------------------------*
  1051. .iff    USE_MENU=0
  1052. .xdef    MNActChg
  1053. ofs    =    0
  1054. .offset    ofs
  1055. ds.l    2
  1056. MC_hdl:    ds.l    1
  1057. MC_num:    ds.w    1
  1058. MC_flg:    ds.w    1
  1059. .text
  1060. MNActChg:
  1061.     link    a6,#ofs
  1062.     movem.l    d1-d4/a1,-(sp)
  1063.  
  1064.     moveq    #0,d1
  1065.     move.l    d1,d2
  1066.     move.w    MC_num(a6),d1
  1067.     move.w    MC_num(a6),d4
  1068.     move.w    MC_flg(a6),d2
  1069.     move.l    MC_hdl(a6),a1
  1070.     move.l    (a1),a1            *Menuのadr
  1071.  
  1072.     subq.w    #1,d4
  1073.     cmp.w    18(a1),d4        *メニューアイテム数が少ない時
  1074.     bgt    MCerr
  1075.  
  1076.     ifeq    <tst.w    d2>        *インアクティブ
  1077.         move.l    10(a1),d3
  1078.         bclr.l    d1,d3
  1079.         move.l    d3,10(a1)
  1080.         moveq    #0,d0
  1081.         bra    MCend
  1082.  
  1083.     elseifeq    <cmpi.w    #1,d2>        *アクティブ
  1084.  
  1085.         move.l    10(a1),d3
  1086.         bset.l    d1,d3
  1087.         move.l    d3,10(a1)
  1088.         moveq    #0,d0
  1089.         bra    MCend
  1090.     endif
  1091. MCerr
  1092.     moveq    #-1,d0
  1093. MCend:
  1094.     movem.l    (sp)+,d1-d4/a1
  1095.     unlk    a6
  1096.     rts
  1097. .endif
  1098. *===============================================*
  1099. *メニューアイテム変更2
  1100. *チェックマークチェンジ
  1101. *move.l    メニューハンドル,-(sp)
  1102. *move.w    アイテム番号,-(sp)    1~
  1103. *move.w    変更フラグ,-(sp)    0,1
  1104. *0ならマークなし、1ならマークセット
  1105. *-----------------------------------------------*
  1106. .iff    USE_RES=0
  1107. .xdef    MNChkMChg
  1108. ofs    =    0
  1109. .offset    ofs
  1110. ds.l    2
  1111. MCM_hdl:    ds.l    1
  1112. MCM_num:    ds.w    1
  1113. MCM_flg:    ds.w    1
  1114. .text
  1115. MNChkMChg:
  1116.     link    a6,#ofs
  1117.     movem.l    d1-d7/a1-a4,-(sp)
  1118.  
  1119.     moveq    #0,d1
  1120.     move.l    d1,d2
  1121.     move.l    d1,d5
  1122.     move.l    d1,d6
  1123.     move.w    MCM_num(a6),d1
  1124.     move.w    MCM_num(a6),d4
  1125.     move.w    MCM_flg(a6),d2
  1126.     move.l    MCM_hdl(a6),a1
  1127.     move.l    (a1),a1            *Menuのadr
  1128.     lea.l    20(a1),a2        *Mdataの先頭adr
  1129.  
  1130.     subq.w    #1,d4            *1減らす
  1131.     cmp.w    18(a1),d4        *変な値取ってないかチェック
  1132.     bgt    MCMerr
  1133.  
  1134. @@:
  1135.     cmp.b    d4,d6            *d6.b=COUNTER
  1136.     beq    @f
  1137.     addq.b    #1,d6            *カウンタ増
  1138.     move.b    2(a2),d5        *d5.b=LASCII文字数
  1139.     ifeq    <btst.l    #0,d5>
  1140.             addq.b    #1,d5        *偶数バンダリ調整(LASCIIが偶数時1追加)
  1141.     endif
  1142.     addq.b    #3,d5
  1143.     adda.l    d5,a2            *次のアイテムの先頭
  1144.     moveq    #0,d5
  1145.     bra    @b
  1146. @@:
  1147.     ifeq    <tst.w d2>        *チェックマーク消す
  1148.         sf    1(a2)    *バイトでクリア
  1149.         moveq    #0,d0
  1150.         bra    MCMend
  1151.     elseifeq <cmpi.w #1,d2>        *アクティブ
  1152.         st    1(a2)    *バイトでセット
  1153.         moveq    #0,d0
  1154.         bra    MCMend
  1155.     endif
  1156.  
  1157. MCMerr:
  1158.     moveq    #-1,d0
  1159. MCMend:
  1160.     movem.l    (sp)+,d1-d7/a1-a4
  1161.     unlk    a6
  1162.     rts
  1163. .endif
  1164. *===============================================*
  1165. .offset    0
  1166. ds.l    2
  1167. TimerP:        ds.l    1
  1168. TickBase:    ds.l    1
  1169. .text
  1170. *===============================================*
  1171. Timerproc::
  1172.     move.l    d1,-(sp)
  1173.  
  1174.     SX    __EMSysTime,0
  1175.  
  1176.         move.l    d0,d1
  1177.         movea.l    TimerP(sp),a0
  1178.         sub.l    (a0),d0        *カウントダウンして、時間きたかをd0に返す
  1179.  
  1180.     ifcs    <cmp.l    TickBase(sp),d0>
  1181.         moveq    #0,d0            *まだ時間きてない
  1182.         bra    TP9
  1183.     else
  1184.         move.l    d1,(a0)
  1185.         moveq    #-1,d0            *きちゃった
  1186.         bra    TP9
  1187.     endif
  1188.  
  1189. TP9:
  1190.     move.l    (sp)+,d1
  1191.     rts
  1192. *===============================================*
  1193. *        DATA_AREA
  1194. *-----------------------------------------------*
  1195. .data
  1196. .even
  1197. e_mes::
  1198.     dc.b    'エラーが発生しました',CR,LF,0
  1199.     .even
  1200. ver_e_mes:
  1201.     dc.b    'このバージョンのSXシステムでは動作しません',CR,LF,0
  1202.     .even
  1203. *===============================================*
  1204. .end    DOSSTART
  1205. *
  1206. *このスケルトンは複数のウィンドウを出すことに一応
  1207. *対応している。
  1208. *注意として、メインのウィンドウは、
  1209. *サブ扱いのウィンドウ(サブウィンドウではない)
  1210. *が使うイベントをマスクしてはいけない
  1211. *また、通常は、サブのウィンドウには、上位ワードに
  1212. *0以外を入れてタスクIDを登録することになってい
  1213. *るが、これを行った場合、サブのウィンドウにはキー
  1214. *ダウンイベントが来なくなる
  1215. *
  1216.